<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      Object.create = function (proto, propertiesObject) {
        //省略了其它判断操作
        function F() {}
        F.prototype = proto;
        if (propertiesObject) {
          Object.defineProperties(F, propertiesObject);
        } //defineProperties的主要作用就是添加或者是修改对象的属性值。
        var f = new F();
        return f;
        f.__proto__ === F.prototype;
        // return new F();
      };
      var obj = { x: 12, y: 13 };
      var test = Object.create(obj);
      console.log(test.x);
      console.log(test.__proto__.x);
    </script>

    <script>
      const obj = {
        username: "张可顺",
        sayhi: function () {
          console.log(obj.username + "你好");
        },
      };

      //   Object.create() 静态方法以一个现有对象作为原型，创建一个新对象。
      //   Object.create(proto, propertiesObject)
      //   参数
      //   proto
      //   新创建对象的原型对象。

      //   propertiesObject 可选
      //   如果该参数被指定且不为 undefined，则该传入对象可枚举的自有属性将为新创建的对象添加具有对应属性名称的属性描述符。
      //   这些属性对应于 Object.defineProperties() 的第二个参数。

      //   返回值
      //   根据指定的原型对象和属性创建的新对象。
      const newobj = Object.create(obj);
      console.log(newobj);
      console.log(newobj.__proto__); //指向obj

      //     Object.defineProperties()
      // Object.defineProperties() 静态方法直接在一个对象上定义新的属性或修改现有属性，并返回该对象。
      const student = Object.create(null, {
        username: {
          value: "zks",
          writable: false,
          enumerable: false,
        },
        age: {
          value: 18,
          writable: false,
          enumerable: false,
        },
      });
      console.log(student);
    </script>
  </body>
</html>
